// 第一题
const obj = {
  name: 'tix',
  sayHi1: () => {
    console.log(this.name);
  },
  sayHi2() {
    (() => {
      console.log(this.name);
    })()
  }
}
// 在node环境中
obj.sayHi1(); // undefined
obj.sayHi2(); // 'tix'

// 在浏览器环境中
obj.sayHi1(); // ''
obj.sayHi2(); // 'tix'

// 第二题
const products = [
  { name: 'xiaomi', stock: 2000 },
  { name: 'iphone14', stock: 1500 },
  { name: 'huawei', stock: 1300 },
]
// 上面所有对象不可更改
// 得到一个新数组，iPhone14得库存减一
// 尽量用一行代码解决
let result = products.map(item => { return item.name === 'iphone14' ? { ...item, stock: item.stock - 1 } : item })
console.log(result);

// // 第三题
// function getItems(fruitList, ...args, favoriteFruit) {
//   return [...fruitList, ...args, favoriteFruit]
// }
// // 下面函数调用结果是什么
// getItems(['banana', 'apple'], 'pear', 'orange')
// // 直接报错，剩余参数必须是最后一个参数

// 第四题
// 实现函数科里化
// 函数科里化（Currying）是一种将函数从接受多个参数转变为接受单一参数的技术，
// 每次调用都返回一个新函数，该函数接受下一个参数。这个过程一直持续到所有参数都被处理完，
// 然后返回最终的结果。
function currying(fn, ...args) {
  return (...rest) => {
    const allArgs = [...args,...rest]
    if(allArgs.length >= fn.length) {
      return fn(...allArgs)
    } else {
      return currying(fn, ...allArgs)
    }
  }
}

// 测试函数科里化
const sum = (a, b, c, d) => a + b + c + d;
console.log(currying(sum)(1)(2)(3)(4)); // 10
console.log(currying(sum, 1)(2, 3)(4)); // 10
console.log(currying(sum, 1, 2)(3)(4)); // 10
console.log(currying(sum, 1, 2)(3, 4)); // 10